/* 
 * File:   Cliente.cpp
 * Author: Maximiliano Monzon (82341)
 * 
 * Created on October 20, 2012, 9:05 AM
 */
#include <cstdio>
#include <iostream>
#include "client_Cliente.h"
#include "common_ProtocoloConstantes.h"

using namespace std;
using namespace TP::Comunicacion;

Cliente::Cliente(const string& pIp, const string& pPuerto, std::ostream& pOstream): ostream (pOstream){
    this->ip = pIp;
    this->puerto = pPuerto;
    this->conexion = new Conexion (this->ip, this->puerto);
}

Cliente::~Cliente() {
    delete this->conexion;
}

void Cliente::Iniciar() throw (Excepcion&){
    try
    {
        this->conexion->agregarManejadorConexionEvento((IManejadorConexionEvento*) this);
        this->conexion->Iniciar();
    }
    catch (Excepcion& pEx)
    {
        pEx.expandirMensaje("No se puede inicar el cliente.");
        throw;
    }
}

void Cliente::Finalizar() throw (Excepcion&){
    try
    {
        this->conexion->Finalizar();
    }
    catch (Excepcion& pEx)
    {
        pEx.expandirMensaje("No se puede finalizar el cliente.");
        throw;
    }
}

void Cliente::notificarMensajeEntrante (IMensajero* pMensajero, const string& pMensaje){
    cout << pMensaje << endl;
}

void Cliente::notificarErrorConexion (IMensajero* pMensajero, const string& pMensaje){

    if ("CONEXION_PERDIDA" == pMensaje)
    {
        cout << pMensaje << endl;
    }
    else
        this->ostream << pMensaje << endl;
}

void Cliente::enviar (const string& pMensaje) throw (Excepcion&){
    try
    {
        string msg_enc = pMensaje;
        // Se codifica el mensaje segun el protocolo especificado.
        
        for (unsigned int i = 0; i < msg_enc.size(); i++)
        {
            switch (msg_enc[i])
            {
                case '\n':
                case '\r':
                case '\t':
                    throw Excepcion ("Definicion de comando invalido.");
                
                case ' ':
                    msg_enc[i] = SEPARADOR_CAMPO;
                    break;
            }
        }
        
        msg_enc += SEPARADOR_CAMPO;
                    
        this->conexion->Escribir(msg_enc);
    }
    catch (Excepcion& pEx)
    {
        pEx.expandirMensaje("Servicio no disponible.");
        throw;
    }
}

